package ru.niir.goodfil.db;

import javax.persistence.*;
import java.io.Serializable;

import static ru.niir.goodfil.utils.Utils.s;

/**
 * Клиентская группа.
 * Клиенсткая группа объединяет в себе клиентов по признаку "сумма закупок за предыдущий месяц".
 * Кстати, разбиение клиентов по группам - процедура не автоматическая, а административная.
 * У клиентская группы есть атрибут "активная". Клиенты неактивной клиентской группы не должны иметь возможность работать с системой.
 */
@Entity
@Table(name = "`ClientGroups`")
public class ClientGroup implements Unique, Serializable {
    /**
     * Идентификатор
     */
    @Id
    @GeneratedValue
    @Column(name = "`Id`")
    private long id = -1;

    /**
     * Наименование группы
     */
    @Column(name = "`Name`", nullable = false)
    private String name = "";

    /**
     * Сумма закупок за предыдущий месяц, являющаяся критерием для для отнесения клиента к этой группе
     */
    @Column(name = "`CriteriaSum`", nullable = false)
    private float criteriaSum = 0;

//    /**
//     * Флаг показывает, что клиентскя группа не активна
//     */
//    @Column(name ="`IsActive`", nullable = false)
//    private boolean active = false;

    /**
     * Флаг показывает, что данная колонка цены отображается для всех
     */
    @Column(name = "`IsShown`")
    private boolean shown = true;

    /**
     * Принадлежность группы товаров к брэнду
     */
    @Column(name = "`IdBrand`")
    private long brandId = 0;

    /**
     * Брэнд, к которому относится клиентская группа
     */
    @Transient
    private Brand brand;

    /**
     * Брэнд, к которому относится клиентская группа
     */
    public Brand getBrand() {
        return brand;
    }

    /**
     * Брэнд, к которому относится клиентская группа
     */
    public void setBrand(Brand brand) {
        this.brand = brand;
    }

    /**
     * Конструктор
     */
    public ClientGroup() {
    }

    /**
     * Конструктор
     *
     * @param name        наименование клиентской группы
     * @param criteriaSum сумма закупок за предыдущий месяц, являющаяся критерием для для отнесения клиента к этой группе
     */
    public ClientGroup(String name, float criteriaSum) {
        assert name != null;

        this.name = name.trim();
        this.criteriaSum = criteriaSum;
    }

    /**
     * Возвращает идентификатор клиенсткой группы
     */
    public long getId() {
        return id;
    }

    /**
     * Возвращает наименование клиентской группы
     */
    public String getName() {
        return name;
    }

    /**
     * Установить наименование клиентской группы
     */
    public void setName(String name) {
        this.name = s(name);
    }

    /**
     * Возвращает сумму закупок за предыдущий месяц, которая является критерием для для отнесения клиента к этой группе
     */
    public float getCriteriaSum() {
        return criteriaSum;
    }

    /**
     * Установить сумму закупок за предыдущий месяц, которая является критерием для для отнесения клиента к этой группе
     *
     * @param criteriaSum положительное число
     */
    public void setCriteriaSum(float criteriaSum) {
        this.criteriaSum = criteriaSum;
    }

    public boolean isShown() {
        return shown;
    }

    public void setShown(boolean shown) {
        this.shown = shown;
    }

    public long getBrandId() {
        return brandId;
    }

    public void setBrandId(long brandId) {
        this.brandId = brandId;
    }

    /**
     * Возвращает название клиентской группы вместе с наименованием брэнда, если брэнд установлен (в формате
     * [Наименование брэнда] - [Наименование клиентской группы])
     */
    public String getLongName() {
        if (brand == null) {
            return getName();
        } else {
            return brand.getName() + " - " + getName();
        }
    }

    @Override
    public String toString() {
        return "ClientGroup{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", criteriaSum=" + criteriaSum +
//                ", active=" + active +
                ", brandId=" + brandId +
                '}';
    }
}
